/***********************************************
 @Name :        小铭同学
 @Time :        2025-08-15
 @Email :       LiaoMingWJ233@163.com
 @Comment :     自定义控件 聊天消息气泡控件
 @FileName :    chatbubble.cpp
 @Version :     1.0
************************************************/

#include "chatbubble.h"
#include <QPainter>
#include <QPainterPath>
#include <QFontMetrics>

ChatBubble::ChatBubble(QWidget *parent) : QWidget(parent)
{
    //=== 初始化UI控件 ===//
    
    // 头像标签（固定40x40）
    avatarLabel = new QLabel(this);
    avatarLabel->setFixedSize(40, 40);
    avatarLabel->setScaledContents(true); // 允许图片缩放
    
    // 名称标签（设置顶部对齐）
    nameLabel = new QLabel(this);
    // 名称标签样式设置
    nameLabel->setStyleSheet(
        "QLabel {"
        "   font-family: '楷体';"    // 字体
        "   font-size: 12px;"                  // 字号
        "   color: #e056c4;"                   // 文字颜色
        "   font-weight: bold;"                // 加粗
        "   margin-bottom: 2px;"               // 与消息框的间距
        "}"
    );
    nameLabel->setAlignment(Qt::AlignTop);
    
    // 消息内容标签（关键设置）
    messageLabel = new QLabel(this);
    messageLabel->setWordWrap(true); // 允许自动换行
    //messageLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); // 文本可选
    //messageLabel->setStyleSheet("border-radius: 8px; padding: 8px; background: transparent;");
    //messageLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // 自适应大小
    messageLabel->setMargin(0); // 移除默认边距
    
    //=== 构建布局 ===//
    
    // 文本布局（名称+消息）
    textLayout = new QVBoxLayout();
    textLayout->setSpacing(0); // 关键：名称和消息之间无间距
    textLayout->setContentsMargins(0, 0, 0, 0); // 无额外边距
    textLayout->addWidget(nameLabel);
    textLayout->addWidget(messageLabel);
    
    // 主布局（头像+文本布局）
    mainLayout = new QHBoxLayout(this);
    mainLayout->setSpacing(10); // 头像与文本间距10px
    mainLayout->setContentsMargins(5, 5, 5, 5); // 四周边距5px
    mainLayout->addWidget(avatarLabel, 0, Qt::AlignTop); // 头像顶部对齐
    mainLayout->addLayout(textLayout);
    
    // 初始化渐变颜色
    setupGradients();
}

ChatBubble::~ChatBubble()
{
    // 安全释放所有布局资源
    clearLayout(mainLayout);
}

void ChatBubble::clearLayout(QLayout* layout)
{
    if (!layout) return;
    
    // 递归删除布局项
    while (QLayoutItem* item = layout->takeAt(0)) {
        if (item->widget()) {
            delete item->widget(); // 删除控件
        }
        delete item; // 删除布局项
    }
}

void ChatBubble::setupGradients()
{
    // 发送者渐变（蓝紫色）
    m_senderGradient.setStart(0, 0);
    m_senderGradient.setFinalStop(0, 1);
    m_senderGradient.setColorAt(0, QColor(100, 120, 255));  // 顶部亮蓝
    m_senderGradient.setColorAt(1, QColor(170, 80, 220));   // 底部紫色
    
    // 接收者渐变（灰绿色）
    m_receiverGradient.setStart(0, 0);
    m_receiverGradient.setFinalStop(0, 1);
    m_receiverGradient.setColorAt(0, QColor(230, 245, 230)); // 顶部淡绿
    m_receiverGradient.setColorAt(1, QColor(210, 230, 210)); // 底部灰绿
}

QPixmap ChatBubble::roundAvatar(const QPixmap &avatar, int size)
{
    // 处理无效头像
    if (avatar.isNull()) {
        return QPixmap(":/default_avatar.png").scaled(
            size, size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    }
    
    // 创建圆形头像
    QPixmap rounded(size, size);
    rounded.fill(Qt::transparent);
    
    QPainter painter(&rounded);
    painter.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿
    
    // 圆形裁剪路径
    QPainterPath path;
    path.addEllipse(0, 0, size, size);
    painter.setClipPath(path);
    
    // 绘制缩放后的头像
    painter.drawPixmap(0, 0, size, size, 
                      avatar.scaled(size, size, Qt::KeepAspectRatio, Qt::SmoothTransformation));
    
    return rounded;
}

int ChatBubble::calculateMessageWidth() const
{
    // 根据父容器宽度计算合适宽度
    int maxWidth = 300; // 最大宽度
    int minWidth = 50;  // 最小宽度
    
    if (parentWidget()) {
        int availableWidth = parentWidget()->width() - 70; // 减去头像和边距
        return qBound(minWidth, availableWidth, maxWidth);
    }
    return maxWidth;
}

void ChatBubble::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    
    if (!messageLabel) return; // 安全校验
    
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿
    
    // 计算消息框绘制区域（扩大8px包含padding）
    QRect msgRect = messageLabel->geometry().adjusted(-8, 0, 8, 8); // 关键：顶部不调整
    
    // 根据消息方向选择样式
    if (m_isMe) {
        painter.setBrush(m_senderGradient);
        messageLabel->setStyleSheet("color: white; border-radius: 8px; padding: 8px; background: transparent;");
    } else {
        painter.setBrush(m_receiverGradient);
        messageLabel->setStyleSheet("color: black; border-radius: 8px; padding: 8px; background: transparent;");
    }
    
    // 绘制圆角矩形背景
    painter.setPen(Qt::NoPen);
    painter.drawRoundedRect(msgRect, 8, 8);
}

void ChatBubble::setMessage(const QString &avatarPath, const QString &senderName, 
                          const QString &message, bool isMe)
{
    m_isMe = isMe; // 设置消息方向
    
    //=== 设置头像 ===//
    QPixmap avatar(avatarPath);
    if (avatar.isNull()) {
        avatar = QPixmap(":/default_avatar.png"); // 默认头像
    }
    avatarLabel->setPixmap(roundAvatar(avatar, 40));
    
    //=== 设置文本内容 ===//
    nameLabel->setText(senderName);
    messageLabel->setText(message);
    
    //=== 调整布局方向 ===//
    if (isMe) {
        // 自己发送：右对齐
        mainLayout->setDirection(QHBoxLayout::RightToLeft);
        textLayout->setAlignment(Qt::AlignRight | Qt::AlignTop);
        nameLabel->setAlignment(Qt::AlignRight | Qt::AlignTop);
        // 自己发送的消息样式
        messageLabel->setStyleSheet(
                    "QLabel {"
                    "   font-family: '楷体';"
                    "   font-size: 14px;"
                    "   color: #e056c4;"                // 文字
                    "}"
                    );
    } else {
        // 接收消息：左对齐
        mainLayout->setDirection(QHBoxLayout::LeftToRight);
        textLayout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
        nameLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop);
        // 接收的消息样式
        messageLabel->setStyleSheet(
                    "QLabel {"
                    "   font-family: '楷体';"
                    "   font-size: 14px;"
                    "   color: #222222;"              // 深灰色文字
                    "}"
            );
    }
    
    //=== 计算消息框尺寸 ===//
    int msgWidth = calculateMessageWidth();
    QFontMetrics fm(messageLabel->font());
    
    // 精确计算文本所需高度（考虑自动换行）
    QRect textRect = fm.boundingRect(
        0, 0, msgWidth, 0, 
        Qt::TextWordWrap, 
        message
    );
    
    // 设置消息框尺寸（包含8px的padding）
    messageLabel->setFixedSize(
        textRect.width() + 16,  // 左右padding各8px
        textRect.height() + 16  // 上下padding各8px
    );
    
    //=== 关键修复：确保名称底部与消息框顶部紧密贴合 ===//
    // 通过设置textLayout的spacing为0和nameLabel的margin-bottom实现
    nameLabel->setStyleSheet(QString("font-weight: bold; margin-bottom: %1px;")
                           .arg(messageLabel->geometry().top() - nameLabel->geometry().bottom()));
    
    update(); // 触发重绘
}
